"""
======================
Author: 柠檬班-小简
Time: 2022/11/7 21:30
Project: day11_framwork_V8
Company: 湖南零檬信息技术有限公司
======================
"""
from loguru import logger
from jsonpath import jsonpath
from tools.my_mysql import HandleMySql
from setttings import shop_mysql
from tools.handle_replace import replace_mark_by_data


def assert_db(assert_db_str, share_obj):
    """
    :param assert_db_str: 来自excel当中的assert_sql列读取出来的内容。   示例：
    [{"sql": 'SELECT * FROM tz_user WHERE user_mobile="#new_phone#" AND user_name="#new_phone#"',
     "expected":1,
     "sql_type":"count"}]

    :return: 列表。列表里面存放的是，每条断言的结果。True还是False.
    """
    # 是否有替换。如果有则先替换。
    assert_db_str = replace_mark_by_data(assert_db_str, share_obj)
    # 如果有换行，则去掉字符串里的换行符。
    assert_db_str = assert_db_str.replace("\n","")
    # 替换完成，转换成列表。列表当中的成员都是字典。
    assert_db_list = eval(assert_db_str)
    # 多条断言表达式，比对结果存储.
    assert_db_result_list = []
    # 连接数据库
    hm = HandleMySql(**shop_mysql)
    # 遍历每一条数据库断言
    for one_assert in assert_db_list:
        logger.info(f'要执行的sql语句是：{one_assert.get("sql")}')
        # 执行sql语句。根据sql_type调用不同的方法来执行。
        if one_assert.get("sql_type") == "count":
            # 如果sql语句执行之后没有内容，那么影响的行数就是0
            real_result = hm.get_query_result_count(one_assert.get("sql"))
            logger.info(f'执行sql语句并获取影响的行数。获取的行数结果为：{real_result}')
        elif one_assert.get("sql_type") == "content":
            # 如果sql语句执行之后没有内容，那么结果就是None
            real_result = hm.select_and_get_result(one_assert.get("sql"))
            logger.info(f'执行sql语句并获取查询数据。获取的内容为：{real_result}')
        else:
            logger.error("不支持count和content以外的类型，无法得到sql的实际结果。请检查是否写错了。那么实际结果设置为-1")
            real_result = "sql_type写错了，不是count或content"
        logger.info(f'期望结果为：{one_assert.get("expected")}')
        logger.info(f'实际与期望的比对结果为：{real_result == one_assert.get("expected")}')
        assert_db_result_list.append(real_result == one_assert.get("expected"))
    logger.info(f"所有sql执行完成并比对完成。最终的结果为：{assert_db_result_list}")
    # 关闭数据库连接
    hm.close_db()
    return assert_db_result_list


if __name__ == '__main__':
    db_assert_str = """[
    {"sql": 'SELECT * FROM tz_user WHERE user_mobile="#new_phone#" 
    AND user_name="#new_phone#"',"expected":1,"sql_type":"count"},
    {"sql": 'SELECT user_name, nick_name FROM tz_user WHERE user_mobile="#new_phone#"',
    "expected":{"user_name": "#new_phone#", "nick_name": "#new_phone#"},"sql_type":"content"}
    ]
    """

    assert_db(db_assert_str)
